import java.util.*;

public class MemorySpiel {

    static Scanner eingabe = new Scanner(System.in);

    public static void main(String[] args) {

        char[][] feld = {
            {'A','A','B','B'},
            {'C','C','D','D'},
            {'E','E','F','F'},
            {'G','G','H','H'}
        };

        boolean[][] aufgedeckt = new boolean[4][4];

        mischeFeld(feld);

        int gefundenePaare = 0;

        while (gefundenePaare < 8) {

            zeigeFeld(feld, aufgedeckt, -1, -1, -1, -1);

            System.out.println("Erste Karte aufdecken (Zeile Spalte): ");
            int z1 = eingabe.nextInt();
            int s1 = eingabe.nextInt();

            System.out.println("Zweite Karte aufdecken (Zeile Spalte): ");
            int z2 = eingabe.nextInt();
            int s2 = eingabe.nextInt();

            if (!gueltig(z1, s1) || !gueltig(z2, s2)) {
                System.out.println("Ungültige Eingabe!");
                continue;
            }

            if (aufgedeckt[z1][s1] || aufgedeckt[z2][s2]) {
                System.out.println("Eine oder beide Karten sind bereits aufgedeckt!");
                continue;
            }

            zeigeFeld(feld, aufgedeckt, z1, s1, z2, s2);

            if (feld[z1][s1] == feld[z2][s2]) {
                System.out.println("Paar gefunden!");
                aufgedeckt[z1][s1] = true;
                aufgedeckt[z2][s2] = true;
                gefundenePaare++;
            } else {
                System.out.println("Kein Paar!");
            }

            System.out.println("\nWeiter mit Enter...");
            eingabe.nextLine();
            eingabe.nextLine();
        }

        zeigeFeld(feld, aufgedeckt, -1, -1, -1, -1);
        System.out.println("Glückwunsch! Du hast alle Paare gefunden!");
    }

    private static void mischeFeld(char[][] feld) {
        Random zufall = new Random();
        for (int i = 0; i < 50; i++) {
            int z1 = zufall.nextInt(4), s1 = zufall.nextInt(4);
            int z2 = zufall.nextInt(4), s2 = zufall.nextInt(4);

            char temp = feld[z1][s1];
            feld[z1][s1] = feld[z2][s2];
            feld[z2][s2] = temp;
        }
    }

    private static boolean gueltig(int zeile, int spalte) {
        return zeile >= 0 && zeile < 4 && spalte >= 0 && spalte < 4;
    }

    private static void zeigeFeld(char[][] feld, boolean[][] aufgedeckt,
                                  int z1, int s1, int z2, int s2) {

        System.out.println("\n------ MEMORY SPIEL ------");
        System.out.println("  0 1 2 3");

        for (int z = 0; z < 4; z++) {
            System.out.print(z + " ");
            for (int s = 0; s < 4; s++) {

                if (aufgedeckt[z][s] ||
                    (z == z1 && s == s1) ||
                    (z == z2 && s == s2)) {

                    System.out.print(feld[z][s] + " ");
                } else {
                    System.out.print("* ");
                }
            }
            System.out.println();
        }
        System.out.println();
    }
}

